package edu.xidian.onlinedocument.views;

import lombok.AllArgsConstructor;
import lombok.Getter;

/******************************************
 * 错误码类型统一参考阿里Java手册中的错误码规范
 *
 * 【强制】错误码的制定原则：
 * 1.快速溯源、简单易记、沟通标准化。
 * 说明：错误码想得过于完美和复杂，就像康熙字典中的生僻字一样，用词似乎精准，但是字典不容易随身携带并且简单易懂。
 * 正例：错误码回答的问题是谁的错？错在哪？
 * 1）错误码必须能够快速知晓错误来源>，可快速判断是谁的问题。
 * 2）错误码易于记忆和比对（代码中容易 equals）。
 * 3）错误码能够脱离文档和系统平台达到线下轻量化地自由沟通的目的。
 *
 * 2.【强制】错误码不体现版本号和错误等级信息。
 * 说明：错误码以不断追加的方式进行兼容。错误等级由日志和错误码本身的释义来决定。
 *
 * 3.【强制】 全部正常，但不得不填充错误码时返回五个零：00000。
 *
 * 4.【强制】错误码为字符串类型，共 5 位，分成两个部分：错误产生来源+四位数字编号。
 * 说明：错误产生来源分为 A/B/C，A 表示错误来源于用户，比如参数错误，用户安装版本过低，用户支付
 * 超时等问题；B 表示错误来源于当前系统，往往是业务逻辑出错，或程序健壮性差等问题；C 表示错误来源于第三方服务，比如 CDN服务出错，消息投递超时等问题；四位数字编号从 0001 到 9999，大类之间的步长间距预留 100
 ******************************************/

@Getter
@AllArgsConstructor
public enum ResultCode {
    SUCCESS(true, "00000", "操作成功"),
    FAILED(false, "99999", "操作失败"),

    // 用户操作返回码
    USER_FAILED(false, "A0000", "用户操作失败"),
    USER_ID_NOT_EXIST(false, "A0001", "用户id不存在"),
    USER_ID_IS_NULL(false, "A0002", "用户id为空"),
    DATA_TYPE_ERROR(false, "A0010", "参数类型错误"),
    DATA_IS_NULL(false, "A0020", "数据体为空"),
    DATE_IS_NULL(false, "A0050", "Date为空"),
    // 注册相关
    REGISTER_FAILED(false, "A0100", "注册失败"),
    USER_ACCOUNT_IS_EXIST(false, "A0101", "账号已存在"),
    USER_ACCOUNT_IS_NULL(false, "A0102", "账号不能为空"),
    USER_ACCOUNT_FORM_ERROR(false, "A0103", "账号格式错误"),
    USER_NAME_IS_NULL(false, "A0111", "昵称不能为空"),
    USER_NAME_FORM_ERROR(false, "A0112", "昵称格式错误"),
    USER_PASSWORD_IS_NULL(false, "A0121", "密码不能为空"),
    USER_PASSWORD_FORM_ERROR(false, "A0122", "密码格式错误"),
    // 登陆相关
    LOGIN_FAILED(false, "A0200", "登录失败"),   // 一级错误码
    USER_ACCOUNT_OR_PASSWORD_ERROR(false, "A0201", "账号或密码错误"),       // 二级错误码
    USER_ACCOUNT_NOT_EXIST(false, "A0202", "账号不存在"),     // 三级错误码
    USER_PASSWORD_ERROR(false, "A0203", "密码错误"),     // 三级错误码
    USER_ACCOUNT_EQUAL_FAILED(false, "A0204", "账号和资源不对应"),
    TOKEN_IS_NULL(false, "A0211", "token不能为空"),
    TOKEN_FORM_ERROR(false, "A0212", "token格式错误"),
    // 注销相关
    LOGOUT_FAILED(false, "A0300", "注销失败"),
    // http请求错误
    SERVLET_REQUEST_ERROR(false, "A0400", "http请求参数错误"),
    SERVLET_NOT_FOUND(false, "A0404", "资源未找到"),
    SERVLET_METHOD_NOT_ALLOWED(false, "A0405", "请求方法不适用与该接口"),
    // 身份验证相关
    VERIFY_FAILED(false, "A0500", "身份验证失败"),
    HTTP_HEADER_IS_NOT_EXIST_TOKEN(false, "A0501", "http请求的header中无token"),
    TOKEN_CHECK_FAILED(false, "A0511", "token不存在"),
    TOKEN_IS_EXIST(false, "A0512", "token已存在"),
    // 文档列表相关
    DOCUMENT_FAILED(false, "A0600", "文档操作错误"),
    DOCUMENT_NAME_IS_NULL(false, "A0601", "文档名不能为空"),
    DOCUMENT_NAME_FORM_ERROR(false, "A0602", "文档名格式错误"),
    DOCUMENT_CREATE_USER_NOT_EXIST(false, "A0603", "文档创建者不存在"),
    DOCUMENT_VERSION_IS_NULL(false, "A0605", "文档版本号为空"),
    DOCUMENT_GET_FAILED(false, "A0610", "文档获取失败"),
    DOCUMENT_NOT_EXIST(false, "A0611", "文档不存在"),
    DOCUMENT_ID_IS_NULL(false, "A0612", "文档id为空"),
    DOCUMENT_DELETE_FAILED(false, "A0620", "文档回收/删除失败"),
    DOCUMENT_FLAG_IS_DELETE(false, "A0621", "文档已经在回收站中"),
    DOCUMENT_FLAG_IS_NOT_DELETE(false, "A0622", "文档不在回收站中"),
    DOCUMENT_ALTER_FAILED(false, "A0630", "文档修改失败"),
    DOCUMENT_JOIN_EDIT_FAILED(false, "A0640", "加入文档编辑失败"),
    DOCUMENT_IS_IN_EDITOR(false, "A0641", "已经加入编辑，无需再加入"),
    DOCUMENT_IS_OUT_EDITOR(false, "A0641", "已经退出编辑，文档处于回收站中"),
    DOCUMENT_NOT_OUT_EDITOR(false, "A0642", "文档不在回收站中"),
    DOCUMENT_IS_NOT_IN_EDITOR(false, "A0643", "不属于该文档的编辑者"),
    // 操作相关
    OPERATION_FAILED(false, "A0700", "operation错误"),
    OPERATION_ID_IS_NULL(false, "A0701", "操作id为空"),
    OPERATION_ID_NOT_EXIST(false, "A0702", "操作id不存在"),
    OPERATION_VERSION_IS_NULL(false, "A0703", "操作version为空"),
    OPERATION_VERSION_NOT_EXIST(false, "A0704", "操作version不存在"),
    OPERATION_NAME_IS_NULL(false, "A0705", "操作name为空"),
    OPERATION_NAME_NOT_EXIST(false, "A0706", "操作name不存在"),
    OPERATION_POSITION_IS_NULL(false, "A0707", "操作position为空"),
    OPERATION_LENGTH_IS_NULL(false, "A0709", "操作length为空"),

    // 系统错误码
    SERVER_ERROR(false, "B0001", "服务器异常"),
    SERVER_TIMEOUT(false, "B0100", "服务器执行超时"),
    SQL_TIMEOUT(false, "B0300", "数据库执行超时"),
    SQL_ERROR(false, "B0400", "SQL语句执行失败"),
    SQL_SELECT_ERROR(false, "B0402", "SQL执行查询语句时失败"),
    SQL_INSERT_ERROR(false, "B0402", "SQL执行插入语句时失败"),
    SQL_DELETE_ERROR(false, "B0403", "SQL执行删除语句时失败"),
    SQL_ALTER_ERROR(false, "B0404", "SQL执行修改语句时失败")
    ;

    boolean success;
    String code;
    String message;
}
